#include "db.h"
#include "log.h"

int db_open(const char *name,dbFile *h)
{
	int err;

	log_start("db");

	err = sqlite3_open(name,&h->db);
	if(err != SQLITE_OK){
		log_err("ERROR: %s.\n",sqlite3_errmsg(h->db));
		return -1;
	}

  h->stmt = NULL;

	return 0;
}


int dbStart(dbFile *h)
{
	if(h->stmt){
		sqlite3_finalize(h->stmt);
	}

	h->stmt = NULL;

	return 0;
}

int dbSql(dbFile *h,const char *sql)
{
	int rc = sqlite3_prepare_v2(h->db,sql,-1,&h->stmt,0);
	if(rc != SQLITE_OK){
		log_info("%s\n",sqlite3_errmsg(h->db));
		log_info("sql: %s\n",sql);
		return -1;
	}

	return 0;
}

int dbStep(dbFile *h)
{
	int rc = sqlite3_step(h->stmt);
	return rc;
}

void dbDone(dbFile *h)
{
	if(h->stmt){
		sqlite3_finalize(h->stmt);
	}

	h->stmt = NULL;
}

//
//
//#define BUFFER_SIZE 8192
//
//void dbDoSql(dbFile *h,char *sql,int (*result)(char *, void *))
//{
//#define result_put(buf,size,...) \
//{\
//	size_t  needed = snprintf(NULL,0,__VA_ARGS__);\
//	if(size + needed > buf_size){\
//		buf_size+=BUFFER_SIZE;\
//		buf = realloc(buf,buf_size);\
//	}\
//	size += sprintf(buf + size,__VA_ARGS__);\
//}
//    int elements = 0;
//    int size = 0;
//    int rc;
//    int buf_size = BUFFER_SIZE;
//    char *stack_buffer = calloc(1,buf_size);
//
//    if(stack_buffer == NULL)
//    	return;
//
////    *(char **)(stack_buffer+BUFFER_SIZE) = NULL;
//
//    dbStart(h);
//    dbSql(h,sql);
//    result_put(stack_buffer,size,"[");
//    while((rc = dbStep(h)) == SQLITE_ROW){
//        if(elements)
//        	result_put(stack_buffer,size,",");
//        elements ++;
//    	int count = sqlite3_column_count(h->stmt);
//        if(count && count <= 1){
//            int type = sqlite3_column_type(h->stmt,0);
//            switch(type){
//                case SQLITE_INTEGER:{
//                    int v = sqlite3_column_int(h->stmt,0);
//                    result_put(stack_buffer,size,"%d",v);
//                }break;
//                case SQLITE_FLOAT:{
//                    double v = sqlite3_column_double(h->stmt,0);
//                    result_put(stack_buffer,size,"%f",v);
//                }break;
//                case SQLITE_TEXT:{
//                    char *v = (void *)sqlite3_column_text(h->stmt,0);
//                    result_put(stack_buffer,size,"\"%s\"",v);
//                }break;
//                case SQLITE_BLOB:
//                case SQLITE_NULL:
//                default:
//                    break;
//            }
//        }else{
//        	result_put(stack_buffer,size,"{");
//        	for (int i = 0; i < count; ++i) {
//        		if(i)
//        			result_put(stack_buffer,size,",");
//        		char *name = (void *)sqlite3_column_name(h->stmt,i);
//        		result_put(stack_buffer,size,"\"%s\":",name);
//        		int type = sqlite3_column_type(h->stmt,i);
//                switch(type){
//                    case SQLITE_INTEGER:{
//                        int v = sqlite3_column_int(h->stmt,i);
//                        result_put(stack_buffer,size,"%d",v);
//                    }break;
//                    case SQLITE_FLOAT:{
//                        double v = sqlite3_column_double(h->stmt,i);
//                        result_put(stack_buffer,size,"%f",v);
//                    }break;
//                    case SQLITE_TEXT:{
//                        char *v = (void *)sqlite3_column_text(h->stmt,i);
//                        result_put(stack_buffer,size,"\"%s\"",v);
//                    }break;
//                    case SQLITE_NULL:
//                    case SQLITE_BLOB:
//                    default:
//                        break;
//                }
//			}
//        	result_put(stack_buffer,size,"}");
//		}
//    }
//    result_put(stack_buffer,size,"]");
//    dbDone(h);
//
//    if(result)
//    	result(stack_buffer,NULL);
//
//    free(stack_buffer);
//}

char *dbGetResultString(dbFile *h,int pos)
{
	return (char *)sqlite3_column_text(h->stmt,pos);
}

uint32_t dbGetResultInt(dbFile *h,int pos)
{
	return (uint32_t)sqlite3_column_int64(h->stmt,pos);
}

float dbGetResultReal(dbFile *h,int pos)
{
	return (float)sqlite3_column_double(h->stmt,pos);
}
